# 闭包
# def func():
#     print("func")


# print(func)  # <function func at 0x000002C757668A40>
# func = 20
# print(func)

# def func1():
#     print("你好")


# def func2():
#     print("你很好")


# def func3():
#     print("你太好了")


# def handle(*fn):
#     for item in fn:
#         item()


# # 我们可以把函数作为返回值返回 可以把函数作为参数传递
# # 装饰器
# lst = [func1, func2, func3]
# print(lst)
# for item in lst:
#     item()
# handle(func1, func2, func3)

# 闭包:内层函数对外层函数的变量的使用
# 可以让一个变量常驻内存
def func():
    a = 10  # 可以保护变量不被修改
    def inner():
        print(a)
        return a
    return inner



# 可以让一个变量被封锁起来 外界只能看到 但是修改不了
fn = func()
b = fn()  # 函数外面访问到了函数局部变量
print(b)
"""
1.函数名的本质就是变量名 可以被赋值 可以给别的变量赋值 做参数传递 做返回值
2.闭包:内层函数使用外层函数的局部变量
    让一个变量能够常驻内存
    保护变量不被修改
"""